/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.compra.managed;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.event.RowEditEvent;
import sv.com.intesal.clases.LimpiarManaged;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.clases.cVarios;
import sv.com.intesal.compra.bean.Compra;
import sv.com.intesal.compra.bean.Empresa;
import sv.com.intesal.compra.bean.Material;
import sv.com.intesal.compra.bean.Proveedor;
import sv.com.intesal.compra.controlador.CompraControlador;
import sv.com.intesal.compra.controlador.EmpresaControlador;
import sv.com.intesal.compra.controlador.MaterialControlador;
import sv.com.intesal.compra.controlador.ProveedorControlador;
import sv.com.intesal.seguridad.controlador.ParametroFacturacionControlador;
import sv.com.intesal.seguridad.controlador.SessionControlador;
import sv.com.intesal.seguridad.managed.SessionManaged;

/**
 *
 * @author Jerez
 */
@ManagedBean(name = "compraModificarManaged")
@ViewScoped
public class CompraModificarManaged implements Serializable {

    private cVarios v;
    private Mensaje m;
    private SessionManaged sm;
    private List<Empresa> cmbEmpresa;
    private List<String> cmbTipo;
    private List<String> formaPagos;

    /*PROVEEDOR*/
    private Proveedor selectedProveedor;

    /*SOLICITUD MATERIAL*/
    private Material selectedMaterial;

    /*COMPRA*/
    private List<Compra> detaCompra;
    private Compra selectedEncaCompraTotales;
    private Compra selectedEncaCompra;
    private Compra selectedDetaCompra;

    public CompraModificarManaged() {
        this.selectedEncaCompra = new Compra();
        this.selectedDetaCompra = new Compra();
        this.selectedEncaCompraTotales = new Compra();
        this.selectedMaterial = new Material();
        this.selectedProveedor = new Proveedor();

        m = new Mensaje();
        sm = new SessionManaged();
        v = new cVarios();
        llenarPagina();
    }

    private void llenarPagina() {
        try {
            if (cmbEmpresa == null) {
                EmpresaControlador ec = new EmpresaControlador();
                cmbEmpresa = ec.fillComboBox();
            }
            if (cmbTipo == null) {
                cVarios v = new cVarios();
                cmbTipo = v.TipoPago();
            }
            if (this.formaPagos == null) {
                cVarios v = new cVarios();
                this.formaPagos = v.FormaPago();
            }
        } catch (Exception e) {
            e.printStackTrace();
            m.messageError(m.getIerror());
        }
    }

    public void modificarCompra() {
        try {
            SessionControlador sc = new SessionControlador();
            if (sc.getCodigo_Proceso_Modificar() != 0) {

                CompraControlador cc = new CompraControlador();
                this.selectedEncaCompra = cc.getEnca(sc.getCodigo_Proceso_Modificar());
                this.detaCompra = cc.getDeta_Compra(this.selectedEncaCompra.getId_c());

                ProveedorControlador pc = new ProveedorControlador();
                selectedProveedor = pc.getProveedor(this.selectedEncaCompra.getId_p());

                sc.setCodigo_Proceso_Modificar(0);
                this.calcularTotales();
            } else {
                if (this.selectedEncaCompra.getId_c() == null) {
                    //Redirect to paginal principal
                    CompraControlador cc = new CompraControlador();
                    cc.redireccionarWfrmPrincipal();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            m.messageError(m.getIerror());
        }
    }

    public void getMaterial_Quick(Material ma) {

        try {
            this.selectedMaterial = ma;
            if (this.getSelectedMaterial() != null) {
                List<Compra> lista = new ArrayList<Compra>();
                if (this.getDetaCompra() != null) {
                    lista = this.getDetaCompra();
                }

                MaterialControlador mc = new MaterialControlador();
                Compra co = new Compra();
                co.setId_d(0);
                co.setExento_d(0.00);
                co.setIva_d(0.00);
                co.setPorcentaje_descuento_d(0.00);
                co.setDescuento_d(0.00);
                co.setSubTotal_d(0.00);

                co.setCosto_sd_d(mc.getMaterial_x_Codigo(this.selectedMaterial.getId_dm()).getCosto_dm());
                co.setCosto_cd_d(mc.getMaterial_x_Codigo(this.selectedMaterial.getId_dm()).getCosto_dm());
                co.setNombre_m(this.selectedMaterial.getNombre_m());
                co.setId_dm(this.selectedMaterial.getId_dm());
                co.setCantidad_d(0.0);

                lista.add(co);
                this.detaCompra = lista;
                this.calcularTotales();
            }
        } catch (Exception e) {
            m.messageError(m.getIerror());
            e.printStackTrace();
        }
    }

    public void getProveedor_Quick(Proveedor pr) {
        try {
            this.selectedProveedor = pr;
            this.calcularTotales();
        } catch (Exception e) {
            e.printStackTrace();
            m.messageError(m.getIerror());
        }
    }

    public void completeTransaction() {
        try {

            if (this.validar() == true) {
                if (sm.validar_rol_usuario("wfrmCompraModificar", sm.modificar) == true) {
                    CompraControlador cc = new CompraControlador();
                    cc.setEnca(this.selectedEncaCompra, detaCompra);
                    LimpiarManaged.limpiar();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            m.messageError(m.getIerror());
        }
    }

    private Boolean validar() throws Exception {

        try {
            Boolean var_return = true;

            if (this.selectedEncaCompra.getTipo_c().equals("--")) {
                m.messageAdvertencia("Seleccionar un Tipo Válido");
                var_return = false;
            }

            if (this.detaCompra == null) {
                m.messageAdvertencia("No hay materiales para realizar la Orden de Compra");
                var_return = false;
            } else if (this.detaCompra.size() <= 0) {
                m.messageAdvertencia("No hay materiales para realizar la Orden de Compra");
                var_return = false;
            }

            if (this.selectedEncaCompra.getId_em() == null) {
                m.messageAdvertencia(m.campoError("EMPRESA"));
                var_return = false;
            }
            if (this.selectedEncaCompra.getFecha_c() == null) {
                m.messageAdvertencia(m.campoError("FECHA"));
                var_return = false;
            }
            if (this.selectedEncaCompra.getFecha_documento_c() == null) {
                m.messageAdvertencia(m.campoError("FECHA DOCUMENTO"));
                var_return = false;
            }

            if (this.selectedProveedor.getNombre_p() == null) {
                m.messageAdvertencia(m.campoError("PROVEEDOR"));
                var_return = false;
            }
            if (this.selectedEncaCompra.getObservacion_c() == null) {
                this.selectedEncaCompra.setObservacion_c("");
            }

            if (var_return == true) {
                for (int i = 0; i < this.detaCompra.size(); i++) {
                    if (detaCompra.get(i).getCosto_sd_d() <= 0.00 || detaCompra.get(i).getCantidad_d() == 0.00) {
                        m.messageAdvertencia("Hay DATOS QUE NO SON VALIDOS EN EL GRID");
                        var_return = false;
                        break;
                    }
                }
            }
            return var_return;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void calcularTotales() {
        try {

            this.selectedEncaCompraTotales.setTotal_costo_sd_c(0.00);
            this.selectedEncaCompraTotales.setTotal_costo_cd_c(0.00);
            this.selectedEncaCompraTotales.setTotal_iva_c(0.00);
            this.selectedEncaCompraTotales.setTotal_exento_c(0.00);
            this.selectedEncaCompraTotales.setTotal_descuento_c(0.00);
            this.selectedEncaCompraTotales.setTotal_subTotal_c(0.00);
            this.selectedEncaCompraTotales.setTotal_c(0.00);
            this.selectedEncaCompraTotales.setTotal_percepcion_c(0.00);
            this.selectedEncaCompra.setTotal_percepcion_c(0.00);
            this.selectedEncaCompra.setPercepcion_c(0.00);

            /*
            if there is no material in the grid it shouldn't calculate the totals
             */
            if (this.detaCompra != null) {
                ParametroFacturacionControlador pf = new ParametroFacturacionControlador();
                for (int i = 0; i < this.detaCompra.size(); i++) {
                    Double iva = pf.getIva();

                    /*DETALLE DE ORDEN DE COMPRA*/
                    this.detaCompra.get(i).setExento_d(0.00);
                    this.detaCompra.get(i).setSubTotal_d(0.00);
                    this.detaCompra.get(i).setIva_d(0.00);

                    this.detaCompra.get(i).setDescuento_d(v.AproximarDecimal((this.detaCompra.get(i).getCosto_sd_d() * this.detaCompra.get(i).getPorcentaje_descuento_d())));
                    this.detaCompra.get(i).setCosto_cd_d(v.AproximarDecimal((this.detaCompra.get(i).getCosto_sd_d() - this.detaCompra.get(i).getDescuento_d())));
                    if (this.selectedEncaCompra.getTipo_c().equals("CCF")) {
                        this.detaCompra.get(i).setIva_d(v.AproximarDecimal(
                                this.detaCompra.get(i).getCantidad_d()
                                * this.detaCompra.get(i).getCosto_cd_d()) * iva);
                    }
                    this.detaCompra.get(i).setSubTotal_d(v.AproximarDecimal(((this.detaCompra.get(i).getCantidad_d() * this.detaCompra.get(i).getCosto_cd_d()) + this.detaCompra.get(i).getIva_d() + this.detaCompra.get(i).getExento_d())));

                    /*CALCULAR TOTALES*/
                    /*COSTO S/D*/
                    this.selectedEncaCompraTotales.setTotal_costo_sd_c(
                            this.detaCompra.get(i).getCosto_sd_d()
                            + this.selectedEncaCompraTotales.getTotal_costo_sd_c());

                    /*IVA*/
                    this.selectedEncaCompraTotales.setTotal_iva_c(
                            this.detaCompra.get(i).getIva_d()
                            + this.selectedEncaCompraTotales.getTotal_iva_c());

                    /*EXENTO*/
                    this.selectedEncaCompraTotales.setTotal_exento_c(
                            this.detaCompra.get(i).getExento_d()
                            + this.selectedEncaCompraTotales.getTotal_exento_c());

                    /*DESCUENTO*/
                    this.selectedEncaCompraTotales.setTotal_descuento_c(
                            this.detaCompra.get(i).getDescuento_d()
                            + this.selectedEncaCompraTotales.getTotal_descuento_c());

                    /*COSTO C/D*/
                    this.selectedEncaCompraTotales.setTotal_costo_cd_c(
                            this.detaCompra.get(i).getCosto_cd_d()
                            + this.selectedEncaCompraTotales.getTotal_costo_cd_c());

                    /*SUB TOTAL*/
                    this.selectedEncaCompraTotales.setTotal_subTotal_c(
                            this.detaCompra.get(i).getSubTotal_d()
                            + this.selectedEncaCompraTotales.getTotal_subTotal_c());
                }

                if (this.selectedEncaCompra.getTipo_c().equals("CCF")) {
                    if (this.selectedProveedor.getPercepcion_p() != null) {
                        if (this.selectedProveedor.getPercepcion_p().equals("S")) {
                            if (this.selectedEncaCompraTotales.getTotal_subTotal_c() >= pf.getValorPercepcion()) {
                                this.selectedEncaCompraTotales.setPercepcion_c(v.AproximarDecimal(this.selectedEncaCompraTotales.getTotal_subTotal_c() * pf.getPercepcion()));
                                this.selectedEncaCompraTotales.setTotal_percepcion_c(this.selectedEncaCompraTotales.getPercepcion_c());

                                this.selectedEncaCompra.setPercepcion_c(this.selectedEncaCompraTotales.getPercepcion_c());
                                this.selectedEncaCompra.setTotal_percepcion_c(this.selectedEncaCompraTotales.getPercepcion_c());

                            }
                        }
                    }
                }

                this.selectedEncaCompraTotales.setTotal_c(
                        v.AproximarDecimal(this.selectedEncaCompraTotales.getTotal_subTotal_c()
                        + this.selectedEncaCompra.getPercepcion_c()));

            }

        } catch (Exception e) {
            e.printStackTrace();
            m.messageError(m.getIerror());
        }
    }

    public void eliminarRegistro() {
        try {
            if (this.selectedDetaCompra == null) {
                m.messageError("DEBE ELEGIR UN REGISTRO PARA CONTINUAR");
            } else if (selectedDetaCompra.getId_d() == null) {
                System.out.println("no id from deta_compra");
                this.detaCompra.remove(this.selectedDetaCompra);
                m.messageInfo(m.getIeliminada()); /*hablar con andy si cambiarlo y que mejor traerlo desde el quick de material. HBALAR CON ANDYOJO 23-FEBUARY*//*falta incorporarlo la de solicitud*/
            } else {
                if (sm.validar_rol_usuario("wfrmCompraModificar", sm.eliminar) == true) {
                    CompraControlador cc = new CompraControlador();
                    if (cc.validar_ItemEliminarCompra(this.selectedDetaCompra) == true) {
                        cc.setEliminarItem(this.selectedDetaCompra);
                        this.detaCompra.remove(this.selectedDetaCompra);
                    }
                }
            }
        } catch (Exception e) {
            m.messageError(m.getIerror());
            e.printStackTrace();
        }
    }

    public void onEditRow(RowEditEvent event) {
        try {
            this.calcularTotales();
        } catch (Exception e) {
            e.printStackTrace();
            m.messageError(m.getIerror());
        }
    }

    /*SETTERS AND GETTERS*/
    public List<Empresa> getCmbEmpresa() {
        return cmbEmpresa;
    }

    public void setCmbEmpresa(List<Empresa> cmbEmpresa) {
        this.cmbEmpresa = cmbEmpresa;
    }

    public List<String> getCmbTipo() {
        return cmbTipo;
    }

    public void setCmbTipo(List<String> cmbTipo) {
        this.cmbTipo = cmbTipo;
    }

    public List<Compra> getDetaCompra() {
        return detaCompra;
    }

    public void setDetaCompra(List<Compra> detaCompra) {
        this.detaCompra = detaCompra;
    }

    public Compra getSelectedDetaCompra() {
        if (selectedDetaCompra == null) {
            selectedDetaCompra = new Compra();
        }
        return selectedDetaCompra;
    }

    public void setSelectedDetaCompra(Compra selectedDetaCompra) {
        this.selectedDetaCompra = selectedDetaCompra;
    }

    public Compra getSelectedEncaCompra() {
        if (selectedEncaCompra == null) {
            selectedEncaCompra = new Compra();
        }
        return selectedEncaCompra;
    }

    public void setSelectedEncaCompra(Compra selectedEncaCompra) {
        this.selectedEncaCompra = selectedEncaCompra;
    }

    public Compra getSelectedEncaCompraTotales() {
        if (selectedEncaCompraTotales == null) {
            selectedEncaCompraTotales = new Compra();
        }
        return selectedEncaCompraTotales;
    }

    public void setSelectedEncaCompraTotales(Compra selectedEncaCompraTotales) {
        this.selectedEncaCompraTotales = selectedEncaCompraTotales;
    }

    public Material getSelectedMaterial() {
        if (selectedMaterial == null) {
            selectedMaterial = new Material();
        }
        return selectedMaterial;
    }

    public void setSelectedMaterial(Material selectedMaterial) {
        this.selectedMaterial = selectedMaterial;
    }

    public Proveedor getSelectedProveedor() {
        if (selectedProveedor == null) {
            selectedProveedor = new Proveedor();
        }
        return selectedProveedor;
    }

    public void setSelectedProveedor(Proveedor selectedProveedor) {
        this.selectedProveedor = selectedProveedor;
    }

    public List<String> getFormaPagos() {
        return formaPagos;
    }

    public void setFormaPagos(List<String> formaPagos) {
        this.formaPagos = formaPagos;
    }
}